/*fwrite()用来一次性写入较大的数据块，主要用途是将数组数据一次性写入文件，适合写入二进制数据。它的原型定义在stdio.h。

size_t fwrite(
  const void* ptr,
  size_t size,
  size_t nmemb,
  FILE* fp
);
它接受四个参数。

ptr：数组指针。
size：每个数组成员的大小，单位字节。
nmemb：数组成员的数量。
fp：要写入的文件指针。
注意，fwrite()原型的第一个参数类型是void*，这是一个无类型指针，编译器会自动将参数指针转成void*类型。正是由于fwrite()不知道数组成员的类型，所以才需要知道每个成员的大小（第二个参数）和成员数量（第三个参数）。
fwrite()函数的返回值是成功写入的数组成员的数量（注意不是字节数）。正常情况下，该返回值就是第三个参数nmemb，但如果出现写入错误，只写入了一部分成员，返回值会比nmemb小。
要将整个数组arr写入文件，可以采用下面的写法。

fwrite(
  arr,
  sizeof(arr[0]),
  sizeof(arr) / sizeof(arr[0]),
  fp
);
上面示例中，sizeof(a[0])是每个数组成员占用的字节，sizeof(a) / sizeof(a[0])是整个数组的成员数量。

下面的例子是将一个大小为256字节的字符串写入文件。

char buffer[256];

fwrite(buffer, 1, 256, fp);
上面示例中，数组buffer每个成员是1个字节，一共有256个成员。由于fwrite()是连续内存复制，所以写成fwrite(buffer, 256, 1, fp)也能达到目的。

fwrite()没有规定一定要写入整个数组，只写入数组的一部分也是可以的。

任何类型的数据都可以看成是1字节数据组成的数组，或者是一个成员的数组，所以fwrite()实际上可以写入任何类型的数据，而不仅仅是数组。比如，fwrite()可以将一个 Struct 结构写入文件保存。

fwrite(&s, sizeof(s), 1, fp);
上面示例中，s是一个 Struct 结构指针，可以看成是一个成员的数组。注意，如果s的属性包含指针，存储时需要小心，因为保存指针可能没意义，还原出来的时候，并不能保证指针指向的数据还存在。

fwrite()以及后面要介绍的fread()，比较适合读写二进制数据，因为它们不会对写入的数据进行解读。二进制数据可能包含空字符\0，这是 C 语言的字符串结尾标记，所以读写二进制文件，不适合使用文本读写函数（比如fprintf()等）。
*/

#include <stdio.h>

int main(void)
{
    FILE *fp;
    unsigned char bytes[] = {5, 37, 0, 88, 255, 12};

    fp = fopen("output.bin", "wb");
    if (fp == NULL)
    {
        printf("open file error\n");
        return -1;
    }
    fwrite(bytes, sizeof(char), sizeof(bytes), fp);
    int closed = fclose(fp);
    if (closed != 0)
    {
        printf("close file error\n");
    }
    return 0;
}